﻿package media;


import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import core.Man;
import core.Mess;


// ==================================================================== Картинка
/**
 * Базовый класс для статических и анимированных картинок.<br />
 */
public class Pic extends Resource {

// =================================================================== Константы


// ================================================================== Переменные
public int w; // Ширина
public int h; // Высота

public BufferedImage img; // Картинка

public String alt; // Текстовый эквивалент

public byte[] seq; // Анимационная последовательность
private byte delay; // Сколько еще кадров демонстрировать текущий кадр
private byte frameP = -1; // Указатель на извлекаемый элемент информации о кадре
private int lastFrame = -1; // Условный номер при последнем вызове

public int drawY; // Верхний левый угол отрисовываемой части картинки (X всегда =0)


// ================================================================= Конструктор
// Пустой
public Pic() {

}


// Статический
public Pic(String alt, String file) {

	//	this.id = id;
	this.alt = alt;

	try {
		URL u = getClass().getResource("/res/s/" + file + ".png");
		img = ImageIO.read(u);

		this.w = img.getWidth();
		this.h = img.getHeight();

	} catch (Exception e) {
		Mess.err("Smile.loadSprite: CAN'T create a sprite", e);
	}
}


// Анимированный
public Pic(String alt, String file, int w, int h, byte[] seq) {

	this.type = Resource.RES_SML_ANI;
	//	this.id = id;
	this.alt = alt;

	try {
		URL u = getClass().getResource("/res/a/" + file + ".png");
		img = ImageIO.read(u);

		this.w = w;
		this.h = h;

		this.seq = seq;

		nextFrame(0);

	} catch (Exception e) {
		Mess.err("Pic.init", "Не удалось загрузить картинку", e);
	}
}


//========================================================== Загрузить картинку
public static BufferedImage loadImage(String fileWithExt) {

	BufferedImage img = null;

	try {
		URL u = Man.main.getClass().getResource("/res/" + fileWithExt);
		img = ImageIO.read(u);

	} catch (Exception e) {
		Mess.err("Smile.loadImage", "Не могу загрузить картинку!", e);
	}

	return img;
}


//========================================================== Загрузить картинку
public static ImageIcon loadIcon(String fileWithExt) {

	URL imgURL = Man.main.getClass().getResource("/res/" + fileWithExt);

	if (imgURL != null) {
		return new ImageIcon(imgURL, null);
	} else {
		Mess.err("Smile.loadIcon", "Не могу загрузить картинку!");
		return null;
	}
}


//================================================================ Выдать адрес
public static URL getURL(String fileWithExt) {

	URL url = Man.main.getClass().getResource("/res/" + fileWithExt);

	return url;
}


// ================================================================== Отрисовать
public void draw(Graphics g, int posX, int posY) {

	// posX, posY передают левый верзний угол
	if (this.type == Resource.RES_SML_ANI) { // Смайл анимирован
		g.drawImage(img, posX, posY, posX + w, posY + h, 0, drawY, w, drawY + h,
				null);
		// TODO Более оптимальный путь - закрыть часть g отсекающим прямоугольником
		//		g.drawRegion(img, 0, drawY, w, h, Sprite.TRANS_NONE, posX, posY,
		//				Graphics.TOP | Graphics.LEFT);
	} else { // Статичный
		g.drawImage(img, posX, posY, null);
	}
}


// ============================================================== Следующий кадр
public boolean nextFrame(int frame) {

	boolean fNew = false;

	if (this.lastFrame != frame) {
		if (--delay <= 0) {
			if (++frameP >= seq.length) {
				this.frameP = 0;
			}
			drawY = seq[this.frameP] * h;
			if (drawY >= this.img.getHeight()) {
				Mess.m("Pic.nextFrame", "Подозрительно большая высота");
			}
			this.delay = this.seq[++this.frameP];
			fNew = true;
		}
		this.lastFrame = frame;
	}

	return fNew;
}


//================================================================ Сериализовать
public byte[] toBytes() {

	// TODO Auto-generated method stub
	return null;
}


//============================================================== Десериализовать
public void fromBytes(byte[] bytes) {

	// TODO Auto-generated method stub

}


}
